package cn.stylefeng.guns.sys.core.listener;

import cn.stylefeng.guns.sys.core.util.DateUtil;
import cn.stylefeng.guns.sys.core.util.UUIDUtils;
import cn.stylefeng.guns.sys.modular.system.model.result.BtySfcDto;
import cn.stylefeng.guns.sys.modular.system.service.BtyMdSfcService;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.SneakyThrows;

import java.util.ArrayList;
import java.util.List;

public class BtySfcListener extends AnalysisEventListener<BtySfcDto> {

    private BtyMdSfcService btyMdSfcService;

    public BtySfcListener(){

    }

    public BtySfcListener(BtyMdSfcService btyMdSfcService){
        this.btyMdSfcService = btyMdSfcService;
    }

    /**
     * 批处理阈值2000
     * 每隔100条存储数据库，然后清理list，方便内存回收
     */
    private static final int BATCH_COUNT = 300;
    List<BtySfcDto> list = new ArrayList<BtySfcDto>();
    //获取当前月的上个月份
    String lastMonth = DateUtil.getLastMonth();//yyyyMM
    String lastMonthStr = DateUtil.getLastMonthStr();//YYYY-MM
    int sx = 4;

    /**
     * 每一条数据解析都会来调用
     */
    @SneakyThrows
    @Override
    public void invoke(BtySfcDto basic, AnalysisContext analysisContext) {

        sx = ++sx;
        basic.setBtyMdSfcId(UUIDUtils.getId());
        String yaoma = basic.getYaoma();
        if (yaoma.contains(".")){
            yaoma = yaoma.substring(0, 7);
        }
        Long btyMdCaiwuId = Long.valueOf(lastMonth + yaoma);
        basic.setYaoma(yaoma);//妖码
        basic.setBtyMdCaiwuId(btyMdCaiwuId);//财务id
        basic.setKjqj(lastMonthStr);//会计月
        basic.setSx(sx);

        list.add(basic);
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     */
    @SneakyThrows
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        analysisContext.readWorkbookHolder().setDefaultReturnMap(false);
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        // 当然也可以有很多其他操作 比如有些需要触发其他的 可以在这里调用
        saveData();
        // log.info("所有数据解析完成！");

    }

    /**
     * 存储数据库
     */
    private void saveData() throws Exception {
        //调用saveData()方法
        btyMdSfcService.insertSfc(list);
    }
}
